package network.server.handler.LibraryHandler;

import module.library.service.BookQueryService;
import module.library.service.impl.BookQueryServiceImpl;
import network.protocol.Request;
import network.protocol.Response;
import network.server.RequestHandler;

import java.util.Map;
/**
 * 图书查询业务请求处理器。
 *
 * <p>负责将网络层 {@link Request} 转换为对 {@link BookQueryService} 的调用，
 * 并返回统一的 {@link Response} 结果。</p>
 */
public class BookQueryHandler implements RequestHandler {

    /** 图书查询服务单例。 */
    private final BookQueryService bookQueryService= BookQueryServiceImpl.getInstance();

    /**
     * 入口处理方法。
     *
     * @param req 客户端请求
     * @return 封装后的响应对象，成功时携带业务数据，失败时携带错误信息
     */
    @Override
    public Response<?> handle(Request req){
        Map<String, Object> params = req.getParams();
        String action = (String) params.get("action");
        return switch (action){
            case "searchBooks"->handleSearchBooks(req);
            case "getBookDetails"->handleBookDetail(req);
            case "getBookItems"->handleBookItem(req);
            default->Response.error("不是可用的操作");
        };
    }

    /**
     * 处理“按字段搜索图书”请求。
     *
     * @param req 原始请求
     * @return 包含查询结果的 {@link Response}
     */
    private Response<?> handleSearchBooks(Request req){
        Map<String,Object> search=req.getParams();
        String keyword=search.get("keyword").toString();
        String searchType=search.get("searchType").toString();
        return bookQueryService.searchBooksByField(keyword,searchType);
    }

    /**
     * 处理“获取图书详情”请求。
     *
     * @param req 原始请求
     * @return 包含图书详情的 {@link Response}
     */
    private Response<?> handleBookDetail(Request req){
        Map<String, Object> params = req.getParams();
        String isbn=params.get("isbn").toString();
        return bookQueryService.getBookDetails(isbn);
    }

    /**
     * 处理“获取图书副本列表”请求。
     *
     * @param req 原始请求
     * @return 包含副本列表的 {@link Response}
     */
    private Response<?> handleBookItem(Request req){
        Map<String, Object> params = req.getParams();
        String isbn=params.get("isbn").toString();
        return bookQueryService.getBookItems(isbn);
    }
}